package com.github.cakin.shiro.chapter16.service;

import com.github.cakin.shiro.chapter16.dao.UserDao;
import com.github.cakin.shiro.chapter16.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.Collections;

/**
 * @className: UserServiceImpl
 * @description: 用户服务实现类
 * @date: 2020/5/19
 * @author: cakin
 */
@Service
public class UserServiceImpl implements UserService {
    /**
     * 注入用户Dao
     */
    @Autowired
    private UserDao userDao;
    /**
     * 注入加密工具类
     */
    @Autowired
    private PasswordHelper passwordHelper;
    /**
     * 注入角色服务
     */
    @Autowired
    private RoleService roleService;

    /**
     * 功能描述：创建用户
     *
     * @param user 用户
     * @return User 用户
     * @author cakin
     * @date 2020/5/19
     */
    public User createUser( User user ) {
        //加密密码
        passwordHelper.encryptPassword(user);
        return userDao.createUser(user);
    }

    /**
     * 功能描述：更新用户
     *
     * @param user 用户
     * @return User 用户
     * @author cakin
     * @date 2020/5/19
     */
    public User updateUser( User user ) {
        return userDao.updateUser(user);
    }

    /**
     * 功能描述：删除用户
     *
     * @param  userId 用户Id
     * @author cakin
     * @date 2020/5/19
     */
    public void deleteUser( Long userId ) {
        userDao.deleteUser(userId);
    }

    /**
     * 功能描述：修改密码
     *
     * @param userId      用户id
     * @param newPassword 新密码
     * @author cakin
     * @date 2020/5/19
     */
    public void changePassword( Long userId, String newPassword ) {
        User user = userDao.findOne(userId);
        user.setPassword(newPassword);
        passwordHelper.encryptPassword(user);
        userDao.updateUser(user);
    }

    /**
     * 功能描述：根据用户Id查找用户
     *
     * @param userId 用户Id
     * @return User 用户
     * @author cakin
     * @date 2020/5/25
     */
    public User findOne( Long userId ) {
        return userDao.findOne(userId);
    }

    /**
     * 功能描述：查询用户列表
     *
     * @author cakin
     * @return List<User> 用户列表
     * @date 2020/5/25
     */
    public List<User> findAll() {
        return userDao.findAll();
    }

    /**
     * 功能描述：根据用户名查找用户
     *
     * @param username 用户名
     * @return User 用户
     * @author cakin
     * @date 2020/5/19
     */
    public User findByUsername( String username ) {
        return userDao.findByUsername(username);
    }

    /**
     * 功能描述：根据用户名查找其角色
     *
     * @param username 用户名
     * @return Set<String> 介绍集合
     * @author cakin
     * @date 2020/5/19
     */
    public Set<String> findRoles( String username ) {
        User user = findByUsername(username);
        if (user == null) {
            return Collections.EMPTY_SET;
        }
        return roleService.findRoles(user.getRoleIds().toArray(new Long[0]));
    }

    /**
     * 功能描述：根据用户名查找其权限
     *
     * @param username 用户名
     * @return Set<String> 权限集合
     * @author cakin
     * @date 2020/5/19
     */
    public Set<String> findPermissions( String username ) {
        User user = findByUsername(username);
        if (user == null) {
            return Collections.EMPTY_SET;
        }
        return roleService.findPermissions(user.getRoleIds().toArray(new Long[0]));
    }

}
